【PHP】配列(array)- 複数の値を記憶するデータ構造

【PHP】配列(array)- 複数の値を記憶するデータ構造

PHPには配列と呼ぶデータ構造があります。

配列は複数の値を記憶でき、配列型の変数や値として扱うことができます。

ここでは、配列について解説します。

検証環境

配列

配列は複数の値を記憶するデータ構造です。

整数型や文字列型と同様に配列型(array)が存在します。

データ構造

配列型の変数と記憶領域の関係をイメージで掴みましょう。

スカラー型(整数型や文字列型など)は1つの記憶領域と繋がりますが、配列型は複数の記憶領域と繋がることが可能です。

配列と記憶領域の繋がり

この1つ1つの繋がりには名前があり、その名前のことをキーと呼びます。

キー

キーは配列と記憶領域の繋がりに対する名前です。

キーには数値や文字列を使うことができ、数値の場合は『キー』ではなく『インデックス』や『添字』という名称で呼ばれることがあります。

配列の生成

配列を扱うには初めに配列を生成します。

基本構文

生成の構文は2通りあります。

変数 = array()
変数 = []

array()または[]を記述することで配列型の値を生成できます。

[]array()の短縮構文と呼ばれる省略した記法です。

サンプル

<?php

___ih_hl_start
$fruits = [];
___ih_hl_end

var_dump($fruits);

?>
$ php sample.php
array(0) {
}

var_dump関数で$fruitsの情報を出力すると、array型(配列型)であることが分かります。

配列の初期化

配列は生成時に初期値を設定できます。

基本構文

初期化の構文は2通りあります。

キーと値

キーと値をセットで記述する初期化の構文です。

変数 = [ 
    キー1 => 値1,
    キー2 => 値2,
    キー3 => 値3
    ...
]

...は任意の数の値を記述できるという意味です。

配列に記憶する複数の値を角括弧([])内に、キー=>で繋ぎ1つのセットとして記述します。

複数ある場合はカンマ(,)区切りで記述することが可能です。

キーの省略

キーを省略した初期化の構文です。

変数 = [ 値1, 値2, 値3 ... ]

...は任意の数の値を記述できるという意味です。

配列に記憶する複数の値を角括弧([])内に、カンマ(,)区切りで値を記述します。

キーを省略すると、各値のキーは先頭から0,1,2...整数値の連番を割り当てられます。

なお、連番は0から始まることに注意してください。

サンプル

<?php

___ih_hl_start
$fruits = [ 'Apple', 'Orange', 'Melon' ];
___ih_hl_end

var_dump($fruits);

?>
$ php sample.php
array(3) {
  [0]=>
  string(5) "Apple"
  [1]=>
  string(6) "Orange"
  [2]=>
  string(5) "Melon"
}

3行目で配列を'Apple''Orange''Melon'の3つの値で初期化しています。

キーは省略したため、先頭から012です。

実際に実行結果からキーと値の情報を確認できます。

例えば、次の部分からは“キーが0の値はstring型の'Apple'”であることが分かります。

[0]=>
string(5) "Apple"

また、キーを省略しない場合は次のようになります。

<?php

___ih_diff_start
-$fruits = [ 'Apple', 'Orange', 'Melon' ];
+$fruits = [ 0 => 'Apple', 1 => 'Orange', 2 => 'Melon' ];
___ih_diff_end

var_dump($fruits);

?>

値の取得

配列の値を取得するにはキーを指定します。

基本構文

変数[キー]

キーの部分は取得する値のキーです。

サンプル

<?php

$fruits = [ 'Apple', 'Orange', 'Melon' ];

___ih_hl_start
echo $fruits[0] . "\n";
echo $fruits[1] . "\n";
echo $fruits[2] . "\n";
___ih_hl_end

?>
$ php sample.php
Apple
Orange
Melon

5〜7行目で配列の各値を取得し、出力しています。

値の記憶

配列に値を記憶するにはキーを指定して、代入演算子で値を代入します。

基本構文

変数[キー] = 値

キーの部分に指定した記憶領域に値を代入します。

既に同じキーが存在する場合は値を上書きし、存在しない場合は新しい記憶領域に指定したキーで繋がりを持ち値を記憶します。

サンプル

<?php

$fruits = [ 'Apple', 'Orange', 'Melon' ];

var_dump($fruits);

___ih_hl_start
$fruits[1] = 'Grape';
$fruits[3] = 'Pineapple';
___ih_hl_end

echo "-------------------------\n";
 
var_dump($fruits);

?>
$ php sample.php
array(3) {
  [0]=>
  string(5) "Apple"
  [1]=>
  string(6) "Orange"
  [2]=>
  string(5) "Melon"
}
-------------------------
array(4) {
  [0]=>
  string(5) "Apple"
  [1]=>
  string(5) "Grape"
  [2]=>
  string(5) "Melon"
  [3]=>
  string(9) "Pineapple"
}

7〜8行目が配列への値の代入です。

7行目は既存のキーに対して値を代入しているため、元の値'Orange'が上書きされ、8行目では新しいキーで値を記憶しています。

1回目と2回目のvar_dump関数の出力を比較すると、値の上書き、追加ができていることが分かります。

配列のサイズ

配列のサイズ(値の個数)はcount関数で取得できます。

関数が未学習の方は、ここでは記法と処理のみ覚えていただければ問題ありません。

基本構文

count(配列型の変数)

サンプル

<?php

$fruits = [ 'Apple', 'Orange', 'Melon' ];

___ih_hl_start
echo count($fruits) . "\n";
___ih_hl_end

$fruits[1] = 'Grape';
$fruits[3] = 'Pineapple';

___ih_hl_start
echo count($fruits) . "\n";
___ih_hl_end

?>
$ php sample.php
3
4

5行目と10行目でcount関数を使用しています。

5行目時点では値は'Apple''Orange'Melon'のため、サイズは3です。

10行目時点では'Pineapple'を追加したため、サイズは4になります。

7行目の$fruits[1] = 'Grape'は既存キーの値を上書きしているだけなので、配列のサイズに影響しません。

注意点

値の取得時に存在しないキーを指定するとエラーが発生します。

<?php

$fruits = [ 'Apple', 'Orange', 'Melon' ];

echo $fruits[3] . "\n";

?>
$ php sample.php
PHP Warning:  Undefined array key 3 in sample.php on line 5

Warning: Undefined array key 3 in sample.php on line 5

このエラーの原因は$fruitsに存在しないキーである3にアクセスしたことです。

また、このようなエラーを避けるため、インデックス(キーが数値)は連番になっていることが望ましくあります。

新しく値を追加するときは、インデックスを指定せずに値を代入することで、インデックスの最大値+1で値を記憶できます。

変数[] = 値

+α($argv)

予備知識になりますが、コマンドライン引数の$argvは配列型の変数です。

詳しくは次のドキュメントをご参照ください。